Linux 中拥塞控制和流量控制
1. 概念区分与整体架构
核心概念对比
生活化比喻:
- 流量控制:像家里的水龙头,接收端说"我的水桶快满了,你慢点放水"
- 拥塞控制:像高速公路,发送端观察"路上车太多了,我要减速避免堵车"
2. TCP 窗口机制详解
窗口类型详解
3. 流量控制机制
滑动窗口原理
接收端缓冲区管理
实际场景示例:
# 场景:文件下载服务器
# 客户端网络慢,服务器发送太快导致接收缓冲区满
# 查看TCP接收缓冲区配置
cat /proc/sys/net/ipv4/tcp_rmem
# 输出:4096 87380 6291456 (最小值 默认值 最大值)
# 查看连接的实际窗口大小
ss -i | grep -A1 "192.168.1.100:80"
# 输出:
# tcp ESTAB 0 0 192.168.1.10:45678 192.168.1.100:80
# cubic wscale:7,7 rto:201 rtt:1.5/0.75 ato:40 mss:1448
# rcvmss:1448 advmss:1448 cwnd:10 ssthresh:7 bytes_acked:1024
# bytes_received:2048 segs_out:8 segs_in:6 send:65.3Mbps
# 关键参数解释:
# cwnd:10 - 拥塞窗口10个MSS
# ssthresh:7 - 慢启动阈值
# send:65.3Mbps - 当前发送速率
4. 拥塞控制算法
TCP Reno 算法状态机
拥塞窗口变化图
真实测试示例:
# 使用iperf3测试拥塞控制效果
# 终端1 (服务器)
iperf3 -s -p 5001
# 终端2 (客户端)
iperf3 -c 192.168.1.100 -p 5001 -t 60 -i 1
# 输出分析:
# [ 4] 0.00-1.00 sec 1.25 MBytes 10.5 Mbits/sec # 慢启动阶段
# [ 4] 1.00-2.00 sec 2.50 MBytes 21.0 Mbits/sec # 指数增长
# [ 4] 2.00-3.00 sec 5.00 MBytes 42.0 Mbits/sec # 继续增长
# [ 4] 3.00-4.00 sec 8.75 MBytes 73.4 Mbits/sec # 接近瓶颈
# [ 4] 4.00-5.00 sec 6.25 MBytes 52.4 Mbits/sec # 检测到拥塞,减速
# [ 4] 5.00-6.00 sec 7.50 MBytes 62.9 Mbits/sec # 拥塞避免阶段
# 同时监控拥塞控制状态
watch -n 1 'ss -i | grep 192.168.1.100'